﻿
#ifndef printerlibs_caysnpos_h
#define printerlibs_caysnpos_h

#ifndef PRINTERLIBS_API
#define PRINTERLIBS_API
#endif

#ifdef __cplusplus
extern "C" {
#endif


#ifndef CallbackFunctionOnNetPrinterDiscovered
#define CallbackFunctionOnNetPrinterDiscovered
typedef void (*on_netprinter_discovered_a)(const char *local_ip, const char *discovered_mac, const char *discovered_ip, const char *discovered_name, const void *private_data);
typedef void (*on_netprinter_discovered_w)(const wchar_t *local_ip, const wchar_t *discovered_mac, const wchar_t *discovered_ip, const wchar_t *discovered_name, const void *private_data);
#endif


#ifndef CallbackFunctionOnBluetoothDeviceDiscovered
#define CallbackFunctionOnBluetoothDeviceDiscovered
typedef void (*on_btdevice_discovered_a)(const char *device_name, const char *device_address, const void *private_data);
#endif


#ifndef CallbackFunctionOnBytesReaded
#define CallbackFunctionOnBytesReaded
typedef void (*on_bytes_readed)(const unsigned char *buffer, const unsigned int count, void *private_data);
#endif


#ifndef CallbackFunctionOnBytesWrited
#define CallbackFunctionOnBytesWrited
typedef void (*on_bytes_writed)(const unsigned char *buffer, const unsigned int count, void *private_data);
#endif


#ifndef CallbackFunctionOnPortClosed
#define CallbackFunctionOnPortClosed
typedef void (*on_port_closed)(void *private_data);
#endif


#ifndef MarcoDefinitionQueryBuffer
#define MarcoDefinitionQueryBuffer
#define PL_QUERYBUFFER_EMTPY 0
#define PL_QUERYBUFFER_FAILED_PORT_CLOSED -1
#define PL_QUERYBUFFER_FAILED_PORT_WRITEFAILED -2
#define PL_QUERYBUFFER_FAILED_PORT_READFAILED -3
#define PL_QUERYBUFFER_NOT_EMPTY -4
#endif


#ifndef MarcoDefinitionPrintResult
#define MarcoDefinitionPrintResult
#define PL_PRINTRESULT_SUCCESS 0
#define PL_PRINTRESULT_PORT_CLOSED -1
#define PL_PRINTRESULT_PORT_WRITEFAILED -2
#define PL_PRINTRESULT_PORT_READFAILED -3
#define PL_PRINTRESULT_PRINTER_OFFLINE -102
#define PL_PRINTRESULT_PRINTER_NOPAPER -103
#define PL_PRINTRESULT_OTHER_RERROR -101
#endif


#ifndef MarcoDefinitionPrinterStatus
#define MarcoDefinitionPrinterStatus
#define PL_PRINTERSTATUS_DRAWER_OPENED(status) (((status >> 0) & 0x04) == 0x00)
#define PL_PRINTERSTATUS_OFFLINE(status) (((status >> 0) & 0x08) == 0x08)
#define PL_PRINTERSTATUS_COVERUP(status) (((status >> 8) & 0x04) == 0x04)
#define PL_PRINTERSTATUS_FEED_PRESSED(status) (((status >> 8) & 0x08) == 0x08)
#define PL_PRINTERSTATUS_NOPAPER(status) (((status >> 8) & 0x20) == 0x20)
#define PL_PRINTERSTATUS_ERROR_OCCURED(status) (((status >> 8) & 0x40) == 0x40)
#define PL_PRINTERSTATUS_CUTTER_ERROR(status) (((status >> 16) & 0x08) == 0x08)
#define PL_PRINTERSTATUS_UNRECOVERABLE_ERROR(status) (((status >> 16) & 0x20) == 0x20)
#define PL_PRINTERSTATUS_DEGREE_OR_VOLTAGE_OVERRANGE(status) (((status >> 16) & 0x40) == 0x40)
#define PL_PRINTERSTATUS_PAPER_NEAREND(status) (((status >> 24) & 0x0C) == 0x0C)
#define PL_PRINTERSTATUS_PAPER_TAKEOUT(status) (((status >> 24) & 0x04) == 0x04)
#endif


#ifndef EnumTypePrintDensity
#define EnumTypePrintDensity
typedef enum PrintDensity { PrintDensity_Light, PrintDensity_Normal, PrintDensity_Dark } PrintDensity;
#endif


#ifndef EnumTypePosAlignment
#define EnumTypePosAlignment
typedef enum PosAlignment { PosAlignment_Left, PosAlignment_HCenter, PosAlignment_Right } PosAlignment;
#endif


#ifndef EnumTypeMultiByteModeEncoding
#define EnumTypeMultiByteModeEncoding
typedef enum MultiByteModeEncoding { MultiByteModeEncoding_GBK = 0, MultiByteModeEncoding_UTF8 = 1, MultiByteModeEncoding_BIG5 = 3, MultiByteModeEncoding_ShiftJIS = 4, MultiByteModeEncoding_EUCKR = 5 } MultiByteModeEncoding;
#endif


#ifndef EnumTypeAsciiTextFontType
#define EnumTypeAsciiTextFontType
typedef enum AsciiTextFontType { AsciiTextFontType_A, AsciiTextFontType_B, AsciiTextFontType_C, AsciiTextFontType_D, AsciiTextFontType_E } AsciiTextFontType;
#endif


#ifndef EnumTypeTextUnderline
#define EnumTypeTextUnderline
typedef enum TextUnderline { TextUnderline_None, TextUnderline_One, TextUnderline_Two } TextUnderline;
#endif


#ifndef EnumTypeCharacterSet
#define EnumTypeCharacterSet
typedef enum CharacterSet {
    CharacterSet_USA = 0,
    CharacterSet_FRANCE = 1,
    CharacterSet_GERMANY = 2,
    CharacterSet_UK = 3,
    CharacterSet_DENMARK_I = 4,
    CharacterSet_SWEDEN = 5,
    CharacterSet_ITALY = 6,
    CharacterSet_SPAIN_I = 7,
    CharacterSet_JAPAN = 8,
    CharacterSet_NORWAY = 9,
    CharacterSet_DENMARK_II = 10,
    CharacterSet_SPAIN_II = 11,
    CharacterSet_LATIN = 12,
    CharacterSet_KOREA = 13,
    CharacterSet_SLOVENIA = 14,
    CharacterSet_CHINA = 15
} CharacterSet;
#endif


#ifndef EnumTypeCharacterCodepage
#define EnumTypeCharacterCodepage
typedef enum CharacterCodepage {
    CharacterCodepage_CP437 = 0,
    CharacterCodepage_KATAKANA = 1,
    CharacterCodepage_CP850 = 2,
    CharacterCodepage_CP860 = 3,
    CharacterCodepage_CP863 = 4,
    CharacterCodepage_CP865 = 5,
    CharacterCodepage_WCP1251 = 6,
    CharacterCodepage_CP866 = 7,
    CharacterCodepage_MIK = 8,
    CharacterCodepage_CP755 = 9,
    CharacterCodepage_IRAN = 10,
    CharacterCodepage_CP862 = 15,
    CharacterCodepage_WCP1252 = 16,
    CharacterCodepage_WCP1253 = 17,
    CharacterCodepage_CP852 = 18,
    CharacterCodepage_CP858 = 19,
    CharacterCodepage_IRAN_II = 20,
    CharacterCodepage_LATVIAN = 21,
    CharacterCodepage_CP864 = 22,
    CharacterCodepage_ISO_8859_1 = 23,
    CharacterCodepage_CP737 = 24,
    CharacterCodepage_WCP1257 = 25,
    CharacterCodepage_THAI = 26,
    CharacterCodepage_CP720 = 27,
    CharacterCodepage_CP855 = 28,
    CharacterCodepage_CP857 = 29,
    CharacterCodepage_WCP1250 = 30,
    CharacterCodepage_CP775 = 31,
    CharacterCodepage_WCP1254 = 32,
    CharacterCodepage_WCP1255 = 33,
    CharacterCodepage_WCP1256 = 34,
    CharacterCodepage_WCP1258 = 35,
    CharacterCodepage_ISO_8859_2 = 36,
    CharacterCodepage_ISO_8859_3 = 37,
    CharacterCodepage_ISO_8859_4 = 38,
    CharacterCodepage_ISO_8859_5 = 39,
    CharacterCodepage_ISO_8859_6 = 40,
    CharacterCodepage_ISO_8859_7 = 41,
    CharacterCodepage_ISO_8859_8 = 42,
    CharacterCodepage_ISO_8859_9 = 43,
    CharacterCodepage_ISO_8859_15 = 44,
    CharacterCodepage_THAI_2 = 45,
    CharacterCodepage_CP856 = 46,
    CharacterCodepage_CP874 = 47,
    CharacterCodepage_TCVN3 = 48
} CharacterCodepage;
#endif


#ifndef EnumTypeBarcodeReadableTextFontType
#define EnumTypeBarcodeReadableTextFontType
typedef enum BarcodeReadableTextFontType { BarcodeReadableTextFontType_Standard, BarcodeReadableTextFontType_Small } BarcodeReadableTextFontType;
#endif


#ifndef EnumTypeBarcodeReadableTextPosition
#define EnumTypeBarcodeReadableTextPosition
typedef enum BarcodeReadableTextPosition { BarcodeReadableTextPosition_None, BarcodeReadableTextPosition_AboveBarcode, BarcodeReadableTextPosition_BelowBarcode, BarcodeReadableTextPosition_AboveAndBelowBarcode } BarcodeReadableTextPosition;
#endif


#ifndef EnumTypePosBarcodeType
#define EnumTypePosBarcodeType
typedef enum PosBarcodeType { 
    PosBarcodeType_UPCA = 0x41,
    PosBarcodeType_UPCE = 0x42,
    PosBarcodeType_EAN13 = 0x43,
    PosBarcodeType_EAN8 = 0x44,
    PosBarcodeType_CODE39 = 0x45,
    PosBarcodeType_ITF = 0x46,
    PosBarcodeType_CODEBAR = 0x47,
    PosBarcodeType_CODE93 = 0x48,
    PosBarcodeType_CODE128 = 0x49
} PosBarcodeType;
#endif


#ifndef EnumTypeQRCodeECC
#define EnumTypeQRCodeECC
typedef enum QRCodeECC { QRCodeECC_L = 1, QRCodeECC_M = 2, QRCodeECC_Q = 3, QRCodeECC_H = 4 } QRCodeECC;
#endif


#ifndef EnumTypeImagePixelsFormat
#define EnumTypeImagePixelsFormat
typedef enum ImagePixelsFormat { 
    ImagePixelsFormat_MONO = 1,
    ImagePixelsFormat_MONOLSB = 2,
    ImagePixelsFormat_GRAY8 = 3,
    ImagePixelsFormat_BYTEORDERED_RGB24 = 4,
    ImagePixelsFormat_BYTEORDERED_BGR24 = 5,
    ImagePixelsFormat_BYTEORDERED_ARGB32 = 6,
    ImagePixelsFormat_BYTEORDERED_RGBA32 = 7,
    ImagePixelsFormat_BYTEORDERED_ABGR32 = 8,
    ImagePixelsFormat_BYTEORDERED_BGRA32 = 9
} ImagePixelsFormat;
#endif


#ifndef EnumTypeImageBinarizationMethod
#define EnumTypeImageBinarizationMethod
typedef enum ImageBinarizationMethod { ImageBinarizationMethod_Dithering, ImageBinarizationMethod_Thresholding } ImageBinarizationMethod;
#endif


#ifndef EnumTypeImageCompressionMethod
#define EnumTypeImageCompressionMethod
typedef enum ImageCompressionMethod { ImageCompressionMethod_None, ImageCompressionMethod_Level1, ImageCompressionMethod_Level2 } ImageCompressionMethod;
#endif

//      获取开发包版本字符串
//
//  return
//      返回开发包版本
PRINTERLIBS_API const char *CaysnPos_LibraryVersion(void);

//      枚举网络打印机
//  
//  timeout
//      超时毫秒时间
// 
//  cancel
//      取消标记位，如果设为非零，则枚举提前退出
//  
//  on_discovered
//      枚举回调接口
//
//  private_data
//      传给回调接口的参数
//
//  return 
//      无
PRINTERLIBS_API void CaysnPos_EnumNetPrinterA(unsigned int timeout, int *cancel, on_netprinter_discovered_a on_discovered, const void *private_data);
PRINTERLIBS_API void CaysnPos_EnumNetPrinterW(unsigned int timeout, int *cancel, on_netprinter_discovered_w on_discovered, const void *private_data);

//      枚举蓝牙4.0打印机
//  
//  on_discovered
//      枚举回调接口
//
//  private_data
//      传给回调接口的参数
//
//  return 
//      无
PRINTERLIBS_API void CaysnPos_EnumBleDeviceA(unsigned int timeout, int *cancel, on_btdevice_discovered_a on_discovered, const void *private_data);

//      打开网口
//
// ip 
//      地址或名称
//      例如：192.168.1.87
//
// port 
//      端口号
//      固定值：9100
//
// timeout
//      连接超时
//
// return 
//      返回打开的端口句柄。非零表示打开成功，零表示打开失败。
//
// remarks
//      PC和打印机需要同网段的才可以连接
PRINTERLIBS_API void * CaysnPos_OpenTcpA(const char *ip, unsigned short port, unsigned int timeout);
PRINTERLIBS_API void * CaysnPos_OpenTcpW(const wchar_t *ip, unsigned short port, unsigned int timeout);

//      在指定接口上打开网口
//
// ip 
//      地址或名称
//      例如：192.168.1.87
//
// port 
//      端口号
//      固定值：9100
//
// bind_local_addr 
//      绑定到本地ip
//      PC安装多网卡的时候，可以指定该项
//      也可以直接传入0自动选择
//
// timeout
//      连接超时
//
// return 
//      返回打开的端口句柄。非零表示打开成功，零表示打开失败。
//
// remarks
//      PC和打印机需要同网段的才可以连接
PRINTERLIBS_API void * CaysnPos_OpenTcpBindInterfaceA(const char *ip, unsigned short port, const char *bind_local_addr, unsigned int timeout);
PRINTERLIBS_API void * CaysnPos_OpenTcpBindInterfaceW(const wchar_t *ip, unsigned short port, const wchar_t *bind_local_addr, unsigned int timeout);

//      连接蓝牙4.0打印机
//
// address
//      打印机地址
//      例如："01:02:03:04:05:06"
//
// return 
//      返回打开的端口句柄。非零表示打开成功，零表示打开失败。
//
// remarks
//      only for android
PRINTERLIBS_API void * CaysnPos_OpenBT4ByConnectA(const char *address);
PRINTERLIBS_API void * CaysnPos_OpenBT4ByConnectW(const wchar_t *address);

//      连接蓝牙4.0打印机
//
// mPeripheral
//      蓝牙打印机设备(CBPeripheral)
//
// return 
//      返回打开的端口句柄。非零表示打开成功，零表示打开失败。
//
// remarks
//      only for ios
PRINTERLIBS_API void * CaysnPos_OpenBT4ByConnectPeripheral(void *mPeripheral);

//      设置蓝牙4.0数据写入模式
//
// handle 
//      端口句柄，由OpenXXX返回
//
// bHighSpeed
//      false: CBCharacteristicWriteWithResponse
//       true: CBCharacteristicWriteWithoutResponse
//
// nPacketSize
//      default value is 20, maybe 120.
//
// nPacketTimeout
//      packet write timeout ms. default is 3600*1000
//
// nPacketMaxRetry
//      packet write retry if failed. default is 3
//
// return 
//      无
//
// remarks
//      only for ios
PRINTERLIBS_API void CaysnPos_SetBT4WriteMode(void * handle, bool bHighSpeed, unsigned int nPacketSize, unsigned int nPacketTimeout, unsigned int nPacketMaxRetry);

//      打开文件
//
// name
//      文件名
//
// return 
//      返回打开的端口句柄。非零表示打开成功，零表示打开失败。
//
// remarks
//      只可写不可读。
//      一切查询状态的函数均是无效的。
PRINTERLIBS_API void * CaysnPos_OpenFileNewA(const char *name);
PRINTERLIBS_API void * CaysnPos_OpenFileNewW(const wchar_t *name);

//      打开文件，后续的打印数据会附加在文件中
//
// name
//      文件名
//
// return 
//      返回打开的端口句柄。非零表示打开成功，零表示打开失败。
//
// remarks
//      只可写不可读。
//      一切查询状态的函数均是无效的。
PRINTERLIBS_API void * CaysnPos_OpenFileAppendA(const char *name);
PRINTERLIBS_API void * CaysnPos_OpenFileAppendW(const wchar_t *name);

//      分配一段内存空间，后续的打印数据会写入到该内存区域
//
// nMemorySpaceSize
//      内存空间大小
//
// return 
//      返回打开的端口句柄。非零表示打开成功，零表示打开失败。
//
// remarks
//      只可写不可读。
//      一切查询状态的函数均是无效的。
//      可通过MemoryData，MemoryDataLength来获取数据
//      可通过ClearMemoryData来清楚内存数据
PRINTERLIBS_API void * CaysnPos_OpenMemory(unsigned int nMemorySpaceSize);

//      获取内存空间的数据
//
// handle 
//      端口句柄，由OpenXXX返回
//
// return 
//      缓冲区指针
//
// remarks
//      无
PRINTERLIBS_API const unsigned char *CaysnPos_MemoryData(void * handle);

//      内存空间的数据长度
//
// handle 
//      端口句柄，由OpenXXX返回
//
// return 
//      缓冲区数据长度
//
// remarks
//      无
PRINTERLIBS_API unsigned int CaysnPos_MemoryDataLength(void * handle);

//      清除内存空间的数据
//
// handle 
//      端口句柄，由OpenXXX返回
//
// return 
//      无
//
// remarks
//      无
PRINTERLIBS_API void CaysnPos_ClearMemoryData(void * handle);


PRINTERLIBS_API int CaysnPos_SetWritedEvent(void * handle, const on_bytes_writed event, void *private_data);


PRINTERLIBS_API int CaysnPos_SetReadedEvent(void * handle, const on_bytes_readed event, void *private_data);


PRINTERLIBS_API int CaysnPos_SetClosedEvent(void * handle, const on_port_closed event, void *private_data);

//      向端口写入数据
//
// handle 
//      端口句柄，由OpenXXX返回
//
// buffer 
//      要写入的数据
//
// count 
//      要写入的长度
//
// timeout 
//      写入超时毫秒
//
// return 
//      返回写入的字节数，-1表示写入失败
PRINTERLIBS_API int CaysnPos_Write(void * handle, const unsigned char *buffer, unsigned int count, unsigned int timeout);

//      从端口接收数据
//
// handle 
//      端口句柄，由OpenXXX返回
//
// buffer 
//      接收数据的缓冲区
//
// count 
//      要接收的数据长度
//
// timeout 
//      读取超时毫秒
//
// return 
//      返回读取的字节数，-1表示失败
PRINTERLIBS_API int CaysnPos_Read(void * handle, unsigned char *buffer, unsigned int count, unsigned int timeout);

//      从端口接收数据
//
// handle 
//      端口句柄，由OpenXXX返回
//
// buffer 
//      接收数据的缓冲区
//
// count 
//      要接收的数据长度
//
// timeout 
//      读取超时毫秒
//
// breakByte
//      结束读取字符
//
// return 
//      返回读取的字节数，-1表示失败
PRINTERLIBS_API int CaysnPos_ReadUntilByte(void * handle, unsigned char *buffer, unsigned int count, unsigned int timeout, unsigned char breakByte);

//      忽略接收缓冲区的数据
//
// handle 
//      端口句柄，由OpenXXX返回
//
// return 
//      无
PRINTERLIBS_API void CaysnPos_SkipAvailable(void * handle);

//      关闭端口
//
// handle 
//      端口句柄，由OpenXXX返回
//
// return 
//      无
PRINTERLIBS_API void CaysnPos_Close(void * handle);

//      查询并等待打印机缓冲区空
//
// handle 
//      端口句柄，由OpenXXX返回
//
// timeout 
//      超时毫秒时间
//
// return 
//      返回打印缓冲区是否已空，各值定义如下
//      值  定义
//      0   缓冲区已空
//      -1  端口已关闭
//      -2  写入失败
//      -3  读取失败
//      -4  缓冲区不为空
PRINTERLIBS_API int CaysnPos_QueryPrinterBufferEmpty(void * handle, unsigned int timeout);

//      实时查询打印机状态（钱箱，纸张，错误）
//
// handle 
//      端口句柄，由OpenXXX返回
//
// timeout 
//      超时毫秒时间
//
// return 
//      返回打印机状态。-1表示查询失败。
//      可通过宏定义访问详细状态信息
PRINTERLIBS_API int CaysnPos_QueryPrinterStatus(void * handle, unsigned int timeout);

//      查询打印结果
//
// handle 
//      端口句柄，由OpenXXX返回
//
// timeout 
//      超时时间
//
// return 
//      返回对应状态，各值定义如下
//      值  定义
//      0   打印成功
//      -1  端口已关闭
//      -2  写入失败
//      -3  读取失败
//      -4  打印机无响应
//      -102 打印机已脱机
//      -103  打印机缺纸
//      -101  其他错误
PRINTERLIBS_API int CaysnPos_QueryPrintResult(void * handle, unsigned int timeout);

//      开钱箱（产生钱箱脉冲）
//
// handle 
//      端口句柄，由OpenXXX返回
//
// nDrawerIndex 
//      钱箱编号，各值说明如下
//      编号      说明
//        0      钱箱引脚2
//        1      钱箱引脚5
//
// nHighLevelTime 
//      高电平毫秒时间
//
// nLowLevelTime 
//      低电平毫秒时间
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_KickOutDrawer(void * handle, int nDrawerIndex, int nHighLevelTime, int nLowLevelTime);

//      蜂鸣器鸣叫
//
// handle 
//      端口句柄，由OpenXXX返回
//
// nBeepCount
//      鸣叫次数
//
// nBeepMs
//      蜂鸣毫秒时间，取值范围[100,900]。取整到百毫秒。
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_Beep(void * handle, int nBeepCount, int nBeepMs);

//      走纸到切刀位置并半切纸
//
// handle 
//      端口句柄，由OpenXXX返回
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_FeedAndHalfCutPaper(void * handle);

//      切刀全切
//
// handle 
//      端口句柄，由OpenXXX返回
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_FullCutPaper(void * handle);

//      切刀半切
//
// handle 
//      端口句柄，由OpenXXX返回
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_HalfCutPaper(void * handle);

//      复位打印机，清除设置
//
// handle 
//      端口句柄，由OpenXXX返回
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_ResetPrinter(void * handle);

//      设置打印机
//
// handle 
//      端口句柄，由OpenXXX返回
//
// setType
//      设置类型
//
// buffer 
//      要写入的数据
//
// count 
//      要写入的长度
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_SetPrinter(void * handle, int setType, const void *buffer, unsigned int count);

//      设置打印速度（部分机型支持）
//
// handle 
//      端口句柄，由OpenXXX返回
//
// nSpeed
//      打印速度，单位毫米每秒
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_SetPrintSpeed(void * handle, int nSpeed);

//      设置打印浓度（部分机型支持）
//
// handle 
//      端口句柄，由OpenXXX返回
//
// nDensity
//      设置打印浓度，各值定义如下：
//      值 定义
//      0  淡
//      1  中
//      2  浓
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_SetPrintDensity(void * handle, PrintDensity nDensity);

//      设置打印加热参数（部分机型支持）
//
// handle 
//      端口句柄，由OpenXXX返回
//
// nMaxHeatDots
//      最大加热点数
//
// nHeatOnTime
//      加热时间(us)
//
// nHeatOffTime
//      加热间隔时间(us)
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_SetPrintHeatPara(void * handle, int nMaxHeatDots, int nHeatOnTime, int nHeatOffTime);

//      打印机打印自检页
//
// handle 
//      端口句柄，由OpenXXX返回
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_PrintSelfTestPage(void * handle);

//      设置打印移动单位
//
// handle 
//      端口句柄，由OpenXXX返回
//
// nHorizontalMovementUnit
//      水平移动单位
//
// nVerticalMovementUnit
//      垂直移动单位
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
// 
// remarks
//      移动单位设置为200，则1mm=8点。
PRINTERLIBS_API int CaysnPos_SetMovementUnit(void * handle, int nHorizontalMovementUnit, int nVerticalMovementUnit);

//      设置打印区域左边空白
//
// handle 
//      端口句柄，由OpenXXX返回
//
// nLeftMargin
//      左边空白
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_SetPrintAreaLeftMargin(void * handle, int nLeftMargin);

//      设置打印区域宽度
//
// handle 
//      端口句柄，由OpenXXX返回
//
// nWidth
//      打印区域宽度
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_SetPrintAreaWidth(void * handle, int nWidth);

//      设置横向绝对打印位置
//
// handle 
//      端口句柄，由OpenXXX返回
//
// nPosition
//      打印位置
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_SetHorizontalAbsolutePrintPosition(void * handle, int nPosition);

//      设置横向相对打印位置
//
// handle 
//      端口句柄，由OpenXXX返回
//
// nPosition
//      打印位置
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_SetHorizontalRelativePrintPosition(void * handle, int nPosition);

//      设置打印对齐方式
//
// handle 
//      端口句柄，由OpenXXX返回
//
// nAlignment
//      打印对齐方式，各值定义如下：
//      值  定义
//      0   左对齐
//      1   中对齐
//      2   右对齐
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_SetAlignment(void * handle, PosAlignment nAlignment);

//      打印机进纸指定行数
//
// handle 
//      端口句柄，由OpenXXX返回
//
// numLines
//      要进的行数
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_FeedLine(void * handle, int numLines);

//      打印机进纸指定点数
//
// handle 
//      端口句柄，由OpenXXX返回
//
// numDots
//      要进的点数
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_FeedDot(void * handle, int numDots);

//      打印文本
//
// handle 
//      端口句柄，由OpenXXX返回
//
// str 
//      要打印的字符串
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_PrintTextA(void * handle, const char *str);

//      打印文本
//
// handle 
//      端口句柄，由OpenXXX返回
//
// str 
//      要打印的字符串
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
// 
// remarks
//      该函数会将数据转为UTF8编码发送。
PRINTERLIBS_API int CaysnPos_PrintTextInUTF8W(void * handle, const wchar_t *str);

//      打印文本
//
// handle 
//      端口句柄，由OpenXXX返回
//
// str 
//      要打印的字符串
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
// 
// remarks
//      该函数会将数据转为GBK编码发送。
PRINTERLIBS_API int CaysnPos_PrintTextInGBKW(void * handle, const wchar_t *str);

//      打印文本
//
// handle 
//      端口句柄，由OpenXXX返回
//
// str 
//      要打印的字符串
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
// 
// remarks
//      该函数会将数据转为BIG5编码发送。
PRINTERLIBS_API int CaysnPos_PrintTextInBIG5W(void * handle, const wchar_t *str);

//      打印文本
//
// handle 
//      端口句柄，由OpenXXX返回
//
// str 
//      要打印的字符串
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
// 
// remarks
//      该函数会将数据转为ShiftJIS编码发送。
PRINTERLIBS_API int CaysnPos_PrintTextInShiftJISW(void * handle, const wchar_t *str);

//      打印文本
//
// handle 
//      端口句柄，由OpenXXX返回
//
// str 
//      要打印的字符串
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
// 
// remarks
//      该函数会将数据转为EUCKR编码发送。
PRINTERLIBS_API int CaysnPos_PrintTextInEUCKRW(void * handle, const wchar_t *str);

//      设置文本放大倍数
//
// handle 
//      端口句柄，由OpenXXX返回
//
// nWidthScale
//      宽度放大倍数
//
// nHeightScale
//      高度放大倍数
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_SetTextScale(void * handle, int nWidthScale, int nHeightScale);

//      设置英文字符字体类型
//
// handle 
//      端口句柄，由OpenXXX返回
//
// nFontType
//      英文字符字体类型，各值定义如下：
//      值  定义
//      0   字型A（12x24）
//      1   字型B（9x17）
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_SetAsciiTextFontType(void * handle, AsciiTextFontType nFontType);

//      设置文本加粗打印
//
// handle 
//      端口句柄，由OpenXXX返回
//
// nBold
//      是否加粗，各值定义如下：
//      值  定义
//      0   不加粗
//      1   加粗
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_SetTextBold(void * handle, int nBold);

//      设置文本下划线
//
// handle 
//      端口句柄，由OpenXXX返回
//
// nUnderline
//      文本下划线，各值定义如下：
//      值  定义
//      0   无下划线
//      1   1点下划线
//      2   2点下划线
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_SetTextUnderline(void * handle, TextUnderline nUnderline);

//      设置文本倒置打印
//
// handle 
//      端口句柄，由OpenXXX返回
//
// nUpsideDown
//      倒置打印，各值定义如下：
//      值  定义
//      0   不倒置打印
//      1   倒置打印
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_SetTextUpsideDown(void * handle, int nUpsideDown);

//      设置黑白反显
//
// handle 
//      端口句柄，由OpenXXX返回
//
// nWhiteOnBlack
//      黑白反显，各值定义如下：
//      值  定义
//      0   不黑白反显
//      1   黑白反显
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_SetTextWhiteOnBlack(void * handle, int nWhiteOnBlack);

//      设置文本旋转90度打印
//
// handle 
//      端口句柄，由OpenXXX返回
//
// nRotate
//      旋转打印，各值定义如下：
//      值  定义
//      0   不旋转打印
//      1   旋转90度打印
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_SetTextRotate(void * handle, int nRotate);

//      设置行高
//
// handle 
//      端口句柄，由OpenXXX返回
//
// nLineHeight
//      行高，范围[1,255]
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_SetTextLineHeight(void * handle, int nLineHeight);

//      设置ASCII字符右边空白
//
// handle 
//      端口句柄，由OpenXXX返回
//
// nSpacing
//      右边空白，范围[1,255]
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_SetAsciiTextCharRightSpacing(void * handle, int nSpacing);

//      设置汉字文本字符左边空白和右边空白
//
// handle 
//      端口句柄，由OpenXXX返回
//
// nLeftSpacing
//      右边空白，范围[1,255]
//
// nRightSpacing
//      右边空白，范围[1,255]
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_SetKanjiTextCharSpacing(void * handle, int nLeftSpacing, int nRightSpacing);

//      设置打印机为单字节编码
//
// handle 
//      端口句柄，由OpenXXX返回
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_SetSingleByteMode(void * handle);

//      设置打印机字符集
//
// handle 
//      端口句柄，由OpenXXX返回
//
// nCharacterSet
//      打印机字符集，范围[0,15]
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_SetCharacterSet(void * handle, CharacterSet nCharacterSet);

//      设置字符代码页
//
// handle 
//      端口句柄，由OpenXXX返回
//
// nCharacterCodepage
//      字符代码页，范围[0,255]
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_SetCharacterCodepage(void * handle, CharacterCodepage nCharacterCodepage);

//      设置打印机为多字节编码
//
// handle 
//      端口句柄，由OpenXXX返回
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_SetMultiByteMode(void * handle);

//      设置打印机多字节编码
//
// handle 
//      端口句柄，由OpenXXX返回
//
// nEncoding
//      多字节编码，各值定义如下：
//      值  定义
//      0   GBK
//      1   UTF8
//      3   BIG5
//      4   SHIFT-JIS
//      5   EUC-KR
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_SetMultiByteEncoding(void * handle, MultiByteModeEncoding nEncoding);

//      定义用户自定义字符字型
//
// handle 
//      端口句柄，由OpenXXX返回
//
// ch
//      需要自定义的字符，取值范围[0x20, 0x7E]
//
// pszFile 
//      图片的路径
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
// 
// remarks
//      如果图片宽高不为12x24，则缩放到12x24。
PRINTERLIBS_API int CaysnPos_SetUserCharacterPatternFromFileA(void * handle, char ch, const char *pszFile);
PRINTERLIBS_API int CaysnPos_SetUserCharacterPatternFromFileW(void * handle, char ch, const wchar_t *pszFile);

//      定义用户自定义字符字型
//
// handle 
//      端口句柄，由OpenXXX返回
//
// ch
//      需要自定义的字符，取值范围[0x20, 0x7E]
//
// data 
//      图片数据。
//
// data_size 
//      图片数据长度
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
// 
// remarks
//      如果图片宽高不为12x24，则缩放到12x24。
PRINTERLIBS_API int CaysnPos_SetUserCharacterPatternFromData(void * handle, char ch, const unsigned char *data, unsigned int data_size);

//      定义用户自定义字符字型
//
// handle 
//      端口句柄，由OpenXXX返回
//
// ch
//      需要自定义的字符，取值范围[0x20, 0x7E]
//
// img_data 
//      图片的像素数据。
//
// img_datalen
//      图片的像素数据字节数。
//
// img_width 
//      图片的像素宽度。
//
// img_height 
//      图片的像素高度。
//
// img_stride 
//      图片水平跨度。表示每行字节数。
//
// img_format
//      图片像素数据格式，各值定义如下
//      值    定义
//      1     mono 
//      2     monolsb 
//      3     gray
//      4     r.g.b in byte-ordered
//      5     b.g.r in byte-ordered
//      6     a.r.g.b in byte-ordered
//      7     r.g.b.a in byte-ordered
//      8     a.b.g.r in byte-ordered
//      9     b.g.r.a in byte-ordered
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
// 
// remarks
//      如果图片宽高不为12x24，则缩放到12x24。
PRINTERLIBS_API int CaysnPos_SetUserCharacterPatternFromPixels(void * handle, char ch, const unsigned char *img_data, unsigned int img_datalen, int img_width, int img_height, int img_stride, ImagePixelsFormat img_format);

//      清除用户自定义字符字型
//
// handle 
//      端口句柄，由OpenXXX返回
//
// ch
//      需要清除的自定义字符，取值范围[0x20, 0x7E]
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_ClearUserCharacterPattern(void * handle, char ch);

//      设置是否启用用户自定义字符集
//
// handle 
//      端口句柄，由OpenXXX返回
//
// enable
//      是否启用
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_SetUserCharacterEnable(void * handle, int enable);

//      定义用户自定义汉字字型
//
// handle 
//      端口句柄，由OpenXXX返回
//
// c1
//      自定义字符字节编码的第一个字节
//
// c2
//      自定义字符字节编码的第二个字节
//
// pszFile 
//      图片的路径
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
// 
// remarks
//      如果图片宽高不为24x24，则缩放到24x24。
PRINTERLIBS_API int CaysnPos_SetUserKanjiPatternFromFileA(void * handle, unsigned char c1, unsigned char c2, const char *pszFile);
PRINTERLIBS_API int CaysnPos_SetUserKanjiPatternFromFileW(void * handle, unsigned char c1, unsigned char c2, const wchar_t *pszFile);

//      定义用户自定义汉字字型
//
// handle 
//      端口句柄，由OpenXXX返回
//
// c1
//      自定义字符字节编码的第一个字节
//
// c2
//      自定义字符字节编码的第二个字节
//
// data 
//      图片数据。
//
// data_size 
//      图片数据长度
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
// 
// remarks
//      如果图片宽高不为24x24，则缩放到24x24。
PRINTERLIBS_API int CaysnPos_SetUserKanjiPatternFromData(void * handle, unsigned char c1, unsigned char c2, const unsigned char *data, unsigned int data_size);

//      定义用户自定义汉字字型
//
// handle 
//      端口句柄，由OpenXXX返回
//
// c1
//      自定义字符字节编码的第一个字节
//
// c2
//      自定义字符字节编码的第二个字节
//
// img_data 
//      图片的像素数据。
//
// img_datalen
//      图片的像素数据字节数。
//
// img_width 
//      图片的像素宽度。
//
// img_height 
//      图片的像素高度。
//
// img_stride 
//      图片水平跨度。表示每行字节数。
//
// img_format
//      图片像素数据格式，各值定义如下
//      值    定义
//      1     mono 
//      2     monolsb 
//      3     gray
//      4     r.g.b in byte-ordered
//      5     b.g.r in byte-ordered
//      6     a.r.g.b in byte-ordered
//      7     r.g.b.a in byte-ordered
//      8     a.b.g.r in byte-ordered
//      9     b.g.r.a in byte-ordered
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
// 
// remarks
//      如果图片宽高不为24x24，则缩放到24x24。
PRINTERLIBS_API int CaysnPos_SetUserKanjiPatternFromPixels(void * handle, unsigned char c1, unsigned char c2, const unsigned char *img_data, unsigned int img_datalen, int img_width, int img_height, int img_stride, ImagePixelsFormat img_format);

//      打印一维条码
//
// handle 
//      端口句柄，由OpenXXX返回
//
// nBarcodeType 
//      标识条码类型 
//      各值定义如下：
//      值    类型
//      0x41     UPC-A
//      0x42     UPC-E
//      0x43     EAN13
//      0x44     EAN8
//      0x45     CODE39
//      0x46     ITF
//      0x47     CODABAR
//      0x48     CODE93
//      0x49     CODE128
//
// str 
//      要打印的条码
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_PrintBarcodeA(void * handle, PosBarcodeType nBarcodeType, const char *str);
PRINTERLIBS_API int CaysnPos_PrintBarcodeW(void * handle, PosBarcodeType nBarcodeType, const wchar_t *str);

//      设置条码和二维码单元宽度
//
// handle 
//      端口句柄，由OpenXXX返回
//
// nBarcodeUnitWidth
//      条码单元宽度，取值范围：[1,6]
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_SetBarcodeUnitWidth(void * handle, int nBarcodeUnitWidth);

//      设置条码高度
//
// handle 
//      端口句柄，由OpenXXX返回
//
// nBarcodeHeight 
//      定义条码高度。取值范围：[1,255]
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_SetBarcodeHeight(void * handle, int nBarcodeHeight);

//      设置条码可读字符字体类型
//
// handle 
//      端口句柄，由OpenXXX返回
//
// nFontType
//      指定可读字符的字体类型，各值定义如下：
//      值  类型
//      0   标准ASCII
//      1   压缩ASCII
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_SetBarcodeReadableTextFontType(void * handle, BarcodeReadableTextFontType nFontType);

//      设置条码可读字符打印位置
//
// handle 
//      端口句柄，由OpenXXX返回
//
// nTextPosition
//      条码可读字符位置，取值范围：[0, 3].
//      各值定义如下： 
//      值 定义 
//      0 不显示可读字符
//      1 在条码下方显示可读字符
//      2 在条码上方显示可读字符
//      3 在条码上方和条码下方显示可读字符
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_SetBarcodeReadableTextPosition(void * handle, BarcodeReadableTextPosition nTextPosition);

//      打印QR码
//
// handle 
//      端口句柄，由OpenXXX返回
//
// nVersion 
//      指定字符版本。取值范围：[0,16]。
//      当 version 为 0 时，打印机根据字符串长度自动计算版本号。
//
// nECCLevel 
//      指定纠错等级。取值范围：[1, 4]。
//      各值定义如下： 
//      ECC 纠错等级 
//      1   L：7%，低纠错，数据多。 
//      2   M：15%，中纠错 
//      3   Q：优化纠错 
//      4   H：30%，最高纠错，数据少。
//
// str 
//      要打印的QR码
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_PrintQRCodeA(void * handle, int nVersion, QRCodeECC nECCLevel, const char *str);
PRINTERLIBS_API int CaysnPos_PrintQRCodeW(void * handle, int nVersion, QRCodeECC nECCLevel, const wchar_t *str);

//      打印QR码
//
// handle 
//      端口句柄，由OpenXXX返回
//
// nQRCodeUnitWidth 
//      QRCode 码码块宽度，取值范围：[1, 16]。
//
// nECCLevel 
//      指定纠错等级。取值范围：[1, 4]。
//      各值定义如下： 
//      ECC 纠错等级 
//      1   L：7%，低纠错，数据多。 
//      2   M：15%，中纠错 
//      3   Q：优化纠错 
//      4   H：30%，最高纠错，数据少。
//
// str 
//      要打印的QR码
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_PrintQRCodeUseEpsonCmdA(void * handle, int nQRCodeUnitWidth, QRCodeECC nECCLevel, const char *str);
PRINTERLIBS_API int CaysnPos_PrintQRCodeUseEpsonCmdW(void * handle, int nQRCodeUnitWidth, QRCodeECC nECCLevel, const wchar_t *str);

//      打印两个QR码
//
// handle 
//      端口句柄，由OpenXXX返回
//
// nQRCodeUnitWidth 
//      QRCode 码码块宽度，取值范围：[1, 8]。
//
// nQR1Position
// nQR2Position
//      QRCode position
//
// nQR1Version 
// nQR2Version 
//      指定字符版本。取值范围：[0,16]。
//      当 version 为 0 时，打印机根据字符串长度自动计算版本号。
//
// nQR1ECCLevel 
// nQR2ECCLevel 
//      指定纠错等级。取值范围：[1, 4]。
//      各值定义如下： 
//      ECC 纠错等级 
//      1   L：7%，低纠错，数据多。 
//      2   M：15%，中纠错 
//      3   Q：优化纠错 
//      4   H：30%，最高纠错，数据少。
//
// strQR1 
// strQR2
//      要打印的QR码
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_PrintDoubleQRCodeA(void * handle, int nQRCodeUnitWidth, int nQR1Position, int nQR1Version, QRCodeECC nQR1ECCLevel, const char *strQR1, int nQR2Position, int nQR2Version, QRCodeECC nQR2ECCLevel, const char *strQR2);
PRINTERLIBS_API int CaysnPos_PrintDoubleQRCodeW(void * handle, int nQRCodeUnitWidth, int nQR1Position, int nQR1Version, QRCodeECC nQR1ECCLevel, const wchar_t *strQR1, int nQR2Position, int nQR2Version, QRCodeECC nQR2ECCLevel, const wchar_t *strQR2);

//      打印PDF417条码
//
// handle 
//      端口句柄，由OpenXXX返回
//
// columnCount
//      列数，取值范围[0,30]
//
// rowCount
//      行数，取值范围0,[3,90]
//
// unitWidth
//      模块单元宽度，取值范围[2,8]
//
// rowHeight 
//      行高，取值范围[2,8]
//
// nECCLevel 
//      指定纠错等级。取值范围：[0,8]。
//
// dataProcessingMode
//      数据处理模式。0选择标准PDF417，1选择截断PDF417。
//
// str 
//      要打印的PDF417码
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_PrintPDF417BarcodeUseEpsonCmdA(void * handle, int columnCount, int rowCount, int unitWidth, int rowHeight, int nECCLevel, int dataProcessingMode, const char *str);
PRINTERLIBS_API int CaysnPos_PrintPDF417BarcodeUseEpsonCmdW(void * handle, int columnCount, int rowCount, int unitWidth, int rowHeight, int nECCLevel, int dataProcessingMode, const wchar_t *str);

//      获取图片宽高
//
// pszFile 
//      图片的路径
//
// depth
//      图片的位深
//
// width 
//      图片的宽度
//
// height 
//      图片的高度
//
// return 
//      返回值指示是否获取成功。返回true表示获取成功，返回false表示获取失败。
PRINTERLIBS_API int CaysnPos_GetImageSizeFromFileA(const char *pszFile, int *depth, int *width, int *height);
PRINTERLIBS_API int CaysnPos_GetImageSizeFromFileW(const wchar_t *pszFile, int *depth, int *width, int *height);

//      从图片数据中获取图片宽和高
//
// data 
//      图片数据。
//
// data_size 
//      图片数据长度
//
// depth
//      图片的位深
//
// width 
//      图片的宽度
//
// height 
//      图片的高度
//
// return 
//      返回值指示是否获取成功。返回true表示获取成功，返回false表示获取失败。
// 
// remarks
//      支持获取主流图片格式的信息，包括但不限于BMP，JPG,PNG等。
PRINTERLIBS_API int CaysnPos_GetImageSizeFromData(const unsigned char *data, unsigned int data_size, int *depth, int *width, int *height);

//      打印图片
//
// handle 
//      端口句柄，由OpenXXX返回
//
// dstw 
//      要打印的宽度
//
// dsth 
//      要打印的高度
//
// pszFile 
//      图片的路径
//
// binaryzation_method
//      图片二值化算法。0表示抖动算法，1表示阀值算法。具体效果请测试查看。
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_PrintRasterImageFromFileA(void * handle, int dstw, int dsth, const char *pszFile, ImageBinarizationMethod binaryzation_method);
PRINTERLIBS_API int CaysnPos_PrintRasterImageFromFileW(void * handle, int dstw, int dsth, const wchar_t *pszFile, ImageBinarizationMethod binaryzation_method);

//      打印图片（图片可由文件读取）
//
// handle 
//      端口句柄，由OpenXXX返回
//
// dstw 
//      要打印的宽度
//
// dsth 
//      要打印的高度
//
// data 
//      图片数据。
//
// data_size 
//      图片数据长度
//
// binaryzation_method
//      图片二值化算法。0表示抖动算法，1表示阀值算法。具体效果请测试查看。
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_PrintRasterImageFromData(void * handle, int dstw, int dsth, const unsigned char *data, unsigned int data_size, ImageBinarizationMethod binaryzation_method);

//      打印图片像素数据
//
// handle 
//      端口句柄，由OpenXXX返回
//
// img_data 
//      图片的像素数据。
//
// img_datalen
//      图片的像素数据字节数。
//
// img_width 
//      图片的像素宽度。
//
// img_height 
//      图片的像素高度。
//
// img_stride 
//      图片水平跨度。表示每行字节数。
//
// img_format
//      图片像素数据格式，各值定义如下
//      值    定义
//      1     mono 
//      2     monolsb 
//      3     gray
//      4     r.g.b in byte-ordered
//      5     b.g.r in byte-ordered
//      6     a.r.g.b in byte-ordered
//      7     r.g.b.a in byte-ordered
//      8     a.b.g.r in byte-ordered
//      9     b.g.r.a in byte-ordered
//
// binaryzation_method
//      图片二值化算法。0表示抖动算法，1表示阀值算法。具体效果请测试查看。
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_PrintRasterImageFromPixels(void * handle, const unsigned char *img_data, unsigned int img_datalen, int img_width, int img_height, int img_stride, ImagePixelsFormat img_format, ImageBinarizationMethod binaryzation_method);

//      打印图片
//
// handle 
//      端口句柄，由OpenXXX返回
//
// dstw 
//      要打印的宽度
//
// dsth 
//      要打印的高度
//
// pszFile 
//      图片的路径
//
// binaryzation_method
//      图片二值化算法。0表示抖动算法，1表示阀值算法。具体效果请测试查看。
//
// compress_method
//      最终打印数据的压缩方式，各值定义如下
//      值    定义
//      0     不压缩
//      1     一级压缩
//      2     二级压缩
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_PrintRasterImageWithCompressFromFileA(void * handle, int dstw, int dsth, const char *pszFile, ImageBinarizationMethod binaryzation_method, ImageCompressionMethod compress_method);
PRINTERLIBS_API int CaysnPos_PrintRasterImageWithCompressFromFileW(void * handle, int dstw, int dsth, const wchar_t *pszFile, ImageBinarizationMethod binaryzation_method, ImageCompressionMethod compress_method);

//      打印图片（图片可由文件读取）
//
// handle 
//      端口句柄，由OpenXXX返回
//
// dstw 
//      要打印的宽度
//
// dsth 
//      要打印的高度
//
// data 
//      图片数据。
//
// data_size 
//      图片数据长度
//
// binaryzation_method
//      图片二值化算法。0表示抖动算法，1表示阀值算法。具体效果请测试查看。
//
// compress_method
//      最终打印数据的压缩方式，各值定义如下
//      值    定义
//      0     不压缩
//      1     一级压缩
//      2     二级压缩
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_PrintRasterImageWithCompressFromData(void * handle, int dstw, int dsth, const unsigned char *data, unsigned int data_size, ImageBinarizationMethod binaryzation_method, ImageCompressionMethod compress_method);

//      打印图片像素数据
//
// handle 
//      端口句柄，由OpenXXX返回
//
// img_data 
//      图片的像素数据。
//
// img_datalen
//      图片的像素数据字节数。
//
// img_width 
//      图片的像素宽度。
//
// img_height 
//      图片的像素高度。
//
// img_stride 
//      图片水平跨度。表示每行字节数。
//
// img_format
//      图片像素数据格式，各值定义如下
//      值    定义
//      1     mono 
//      2     monolsb 
//      3     gray
//      4     r.g.b in byte-ordered
//      5     b.g.r in byte-ordered
//      6     a.r.g.b in byte-ordered
//      7     r.g.b.a in byte-ordered
//      8     a.b.g.r in byte-ordered
//      9     b.g.r.a in byte-ordered
//
// binaryzation_method
//      图片二值化算法。0表示抖动算法，1表示阀值算法。具体效果请测试查看。
//
// compress_method
//      最终打印数据的压缩方式，各值定义如下
//      值    定义
//      0     不压缩
//      1     一级压缩
//      2     二级压缩
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_PrintRasterImageWithCompressFromPixels(void * handle, const unsigned char *img_data, unsigned int img_datalen, int img_width, int img_height, int img_stride, ImagePixelsFormat img_format, ImageBinarizationMethod binaryzation_method, ImageCompressionMethod compress_method);

//      填充点图到当前行
//
// handle 
//      端口句柄，由OpenXXX返回
//
// pszFile 
//      图片的路径
//
// binaryzation_method
//      图片二值化算法。0表示抖动算法，1表示阀值算法。具体效果请测试查看。
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
// 
// remarks
//      如果图像超过24点高度，则会缩放到24点高度打印。
//      如果图像不足24点高度，则会填充到24点高度打印。
PRINTERLIBS_API int CaysnPos_FillDotImageToCurrentLineFromFileA(void * handle, const char *pszFile, ImageBinarizationMethod binaryzation_method);
PRINTERLIBS_API int CaysnPos_FillDotImageToCurrentLineFromFileW(void * handle, const wchar_t *pszFile, ImageBinarizationMethod binaryzation_method);

//      填充点图到当前行
//
// handle 
//      端口句柄，由OpenXXX返回
//
// data 
//      图片数据。
//
// data_size 
//      图片数据长度
//
// binaryzation_method
//      图片二值化算法。0表示抖动算法，1表示阀值算法。具体效果请测试查看。
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
// 
// remarks
//      如果图像超过24点高度，则会缩放到24点高度打印。
//      如果图像不足24点高度，则会填充到24点高度打印。
PRINTERLIBS_API int CaysnPos_FillDotImageToCurrentLineFromData(void * handle, const unsigned char *data, unsigned int data_size, ImageBinarizationMethod binaryzation_method);

//      填充点图到当前行
//
// handle 
//      端口句柄，由OpenXXX返回
//
// img_data 
//      图片的像素数据。
//
// img_datalen
//      图片的像素数据字节数。
//
// img_width 
//      图片的像素宽度。
//
// img_height 
//      图片的像素高度。
//
// img_stride 
//      图片水平跨度。表示每行字节数。
//
// img_format
//      图片像素数据格式，各值定义如下
//      值    定义
//      1     mono 
//      2     monolsb 
//      3     gray
//      4     r.g.b in byte-ordered
//      5     b.g.r in byte-ordered
//      6     a.r.g.b in byte-ordered
//      7     r.g.b.a in byte-ordered
//      8     a.b.g.r in byte-ordered
//      9     b.g.r.a in byte-ordered
//
// binaryzation_method
//      图片二值化算法。0表示抖动算法，1表示阀值算法。具体效果请测试查看。
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
// 
// remarks
//      如果图像超过24点高度，则会缩放到24点高度打印。
//      如果图像不足24点高度，则会填充到24点高度打印。
PRINTERLIBS_API int CaysnPos_FillDotImageToCurrentLineFromPixels(void * handle, const unsigned char *img_data, unsigned int img_datalen, int img_width, int img_height, int img_stride, ImagePixelsFormat img_format, ImageBinarizationMethod binaryzation_method);

//      打印图片
//
// handle 
//      端口句柄，由OpenXXX返回
//
// nPosition
//      打印位置
//
// dstw 
//      要打印的宽度
//
// dsth 
//      要打印的高度
//
// pszFile 
//      图片的路径
//
// binaryzation_method
//      图片二值化算法。0表示抖动算法，1表示阀值算法。具体效果请测试查看。
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
// 
// remarks
//      如果图像高度不为24的倍数，则会填充高度到24的倍数打印。
PRINTERLIBS_API int CaysnPos_PrintDotImageSpecifyHorizontalPositionFromFileA(void * handle, int nPosition, int dstw, int dsth, const char *pszFile, ImageBinarizationMethod binaryzation_method);
PRINTERLIBS_API int CaysnPos_PrintDotImageSpecifyHorizontalPositionFromFileW(void * handle, int nPosition, int dstw, int dsth, const wchar_t *pszFile, ImageBinarizationMethod binaryzation_method);

//      打印图片
//
// handle 
//      端口句柄，由OpenXXX返回
//
// nPosition
//      打印位置
//
// dstw 
//      要打印的宽度
//
// dsth 
//      要打印的高度
//
// data 
//      图片数据。
//
// data_size 
//      图片数据长度
//
// binaryzation_method
//      图片二值化算法。0表示抖动算法，1表示阀值算法。具体效果请测试查看。
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
// 
// remarks
//      如果图像高度不为24的倍数，则会填充高度到24的倍数打印。
PRINTERLIBS_API int CaysnPos_PrintDotImageSpecifyHorizontalPositionFromData(void * handle, int nPosition, int dstw, int dsth, const unsigned char *data, unsigned int data_size, ImageBinarizationMethod binaryzation_method);

//      打印图片
//
// handle 
//      端口句柄，由OpenXXX返回
//
// nPosition
//      打印位置
//
// img_data 
//      图片的像素数据。
//
// img_datalen
//      图片的像素数据字节数。
//
// img_width 
//      图片的像素宽度。
//
// img_height 
//      图片的像素高度。
//
// img_stride 
//      图片水平跨度。表示每行字节数。
//
// img_format
//      图片像素数据格式，各值定义如下
//      值    定义
//      1     mono 
//      2     monolsb 
//      3     gray
//      4     r.g.b in byte-ordered
//      5     b.g.r in byte-ordered
//      6     a.r.g.b in byte-ordered
//      7     r.g.b.a in byte-ordered
//      8     a.b.g.r in byte-ordered
//      9     b.g.r.a in byte-ordered
//
// binaryzation_method
//      图片二值化算法。0表示抖动算法，1表示阀值算法。具体效果请测试查看。
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
// 
// remarks
//      如果图像高度不为24的倍数，则会填充高度到24的倍数打印。
PRINTERLIBS_API int CaysnPos_PrintDotImageSpecifyHorizontalPositionFromPixels(void * handle, int nPosition, const unsigned char *img_data, unsigned int img_datalen, int img_width, int img_height, int img_stride, ImagePixelsFormat img_format, ImageBinarizationMethod binaryzation_method);

//      定义NV位图
//
// handle 
//      端口句柄，由OpenXXX返回
//
// count 
//      图片的数目
//
// pszFiles 
//      图片的路径
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_SetNVImageFromFilesA(void * handle, unsigned int count, const char **pszFiles);
PRINTERLIBS_API int CaysnPos_SetNVImageFromFilesW(void * handle, unsigned int count, const wchar_t **pszFiles);

//      定义NV位图
//
// handle 
//      端口句柄，由OpenXXX返回
//
// count 
//      图片的数目
//
// pdata 
//      图片数据
//
// pdata_size 
//      图片数据长度
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_SetNVImageFromDatas(void * handle, unsigned int count, unsigned char **pdata, unsigned int *pdata_size);

//      打印nv位图
//
// handle 
//      端口句柄，由OpenXXX返回
//
// no 
//      nv位图编号，按照下载的顺序指定。第一个文件编号为1，第二个文件编号为2，以此类推。
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_PrintNVImage(void * handle, int no);

//      清除nv位图
//
// handle 
//      端口句柄，由OpenXXX返回
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_ClearNVImage(void * handle);

//      定义RAM位图
//
// handle 
//      端口句柄，由OpenXXX返回
//
// pszFile 
//      图片的路径
//
// binaryzation_method
//      图片二值化算法。0表示抖动算法，1表示阀值算法。具体效果请测试查看。
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_SetRAMImageFromFileA(void * handle, int dstw, int dsth, const char *pszFile, ImageBinarizationMethod binaryzation_method);
PRINTERLIBS_API int CaysnPos_SetRAMImageFromFileW(void * handle, int dstw, int dsth, const wchar_t *pszFile, ImageBinarizationMethod binaryzation_method);

//      定义RAM位图
//
// handle 
//      端口句柄，由OpenXXX返回
//
// data 
//      图片数据。
//
// data_size 
//      图片数据长度
//
// binaryzation_method
//      图片二值化算法。0表示抖动算法，1表示阀值算法。具体效果请测试查看。
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_SetRAMImageFromData(void * handle, int dstw, int dsth, const unsigned char *data, unsigned int data_size, ImageBinarizationMethod binaryzation_method);

//      定义RAM位图
//
// handle 
//      端口句柄，由OpenXXX返回
//
// img_data 
//      图片的像素数据。
//
// img_datalen
//      图片的像素数据字节数。
//
// img_width 
//      图片的像素宽度。
//
// img_height 
//      图片的像素高度。
//
// img_stride 
//      图片水平跨度。表示每行字节数。
//
// img_format
//      图片像素数据格式，各值定义如下
//      值    定义
//      1     mono 
//      2     monolsb 
//      3     gray
//      4     r.g.b in byte-ordered
//      5     b.g.r in byte-ordered
//      6     a.r.g.b in byte-ordered
//      7     r.g.b.a in byte-ordered
//      8     a.b.g.r in byte-ordered
//      9     b.g.r.a in byte-ordered
//
// binaryzation_method
//      图片二值化算法。0表示抖动算法，1表示阀值算法。具体效果请测试查看。
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_SetRAMImageFromPixels(void * handle, const unsigned char *img_data, unsigned int img_datalen, int img_width, int img_height, int img_stride, ImagePixelsFormat img_format, ImageBinarizationMethod binaryzation_method);

//      打印RAM位图
//
// handle 
//      端口句柄，由OpenXXX返回
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_PrintRAMImage(void * handle);

//      打印一条水平线
//
// handle 
//      端口句柄，由OpenXXX返回
//
// nLineStartPosition
//      线段起点位置
//
// nLineEndPosition
//      线段终点位置
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_PrintHorizontalLine(void * handle, int nLineStartPosition, int nLineEndPosition);

//      打印一条水平线
//
// handle 
//      端口句柄，由OpenXXX返回
//
// nLineStartPosition
//      线段起点位置
//
// nLineEndPosition
//      线段终点位置
//
// nLineThickness
//      线段粗细
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_PrintHorizontalLineSpecifyThickness(void * handle, int nLineStartPosition, int nLineEndPosition, int nLineThickness);

//      同一行上打印多条水平线，连续调用可打印曲线
//
// handle 
//      端口句柄，由OpenXXX返回
//
// nLineCount
//      线段条数
//
// pLineStartPosition
//      线段起点位置
//
// pLineEndPosition
//      线段终点位置
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_PrintMultipleHorizontalLinesAtOneRow(void * handle, int nLineCount, int *pLineStartPosition, int *pLineEndPosition);

//      启用黑标模式
//
// handle 
//      端口句柄，由OpenXXX返回
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_EnableBlackMarkMode(void * handle);

//      禁用黑标模式
//
// handle 
//      端口句柄，由OpenXXX返回
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_DisableBlackMarkMode(void * handle);

//      设置黑标最大查找距离（重启仍有效）
//
// handle 
//      端口句柄，由OpenXXX返回
//
// maxFindLength
//      最大查找距离（maxFindLength x 0.125 毫米）
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_SetBlackMarkMaxFindLength(void * handle, int maxFindLength);

//      查找下一个黑标
//
// handle 
//      端口句柄，由OpenXXX返回
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_FindBlackMark(void * handle);

//      黑标模式下，设置起始打印位置的调整值
//
// handle 
//      端口句柄，由OpenXXX返回
//
// position
//      大于0则指定为进纸，小于0则指定为退纸。距离为 position x 0.125 毫米。
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_SetBlackMarkPaperPrintPosition(void * handle, int position);

//      黑标模式下，设置切纸位置
//
// handle 
//      端口句柄，由OpenXXX返回
//
// position
//      大于0则指定为进纸，小于0则指定为退纸。距离为 position x 0.125 毫米。
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_SetBlackMarkPaperCutPosition(void * handle, int position);

//      切刀全切
//
// handle 
//      端口句柄，由OpenXXX返回
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_FullCutBlackMarkPaper(void * handle);

//      切刀半切
//
// handle 
//      端口句柄，由OpenXXX返回
//
// return 
//      返回值仅指示指令是否写入成功。返回true表示写入成功，返回false表示写入失败。
PRINTERLIBS_API int CaysnPos_HalfCutBlackMarkPaper(void * handle);


#ifdef __cplusplus
}
#endif

#endif

